export const LIFECYCLE_HOOKS = [
    'beforeCreate',
    'created',
    'beforeMount',
    'mounted',
    'beforeUpdate',
    'updated',
    'beforeDestroy',
    'destroyed',
]
const strats = {};

function mergeHook(parentVal, childValue) {
    // 如果合并对象child 有生命周期
    if (childValue) {
        // 被合并的parent 也有直接拼接
        if (parentVal) {
            return parentVal.concat(childValue);
        } else {
            // 否则就用子节点的
            return [childValue]
        }
    } else {
        return parentVal;
    }
}
LIFECYCLE_HOOKS.forEach(hook => {
    strats[hook] = mergeHook
})
export function mergeOptions(parent, child) {
    const options = {}

    // 先循被合并的对象parent的key 
    for (let key in parent) {
        mergeField(key)
    }
    // 在循合并对象child 的key 其中是被循环不存在key
    for (let key in child) {
        if (!parent.hasOwnProperty(key)) {
            mergeField(key);
        }
    }

    function mergeField(key) {
        // 声明周期是特殊的如果相同是要存在数组中的这里做了一个策略
        if (strats[key]) {
            options[key] = strats[key](parent[key], child[key]);
        } else {
            // 如果父子都有就都合并
            if (typeof parent[key] == 'object' && typeof child[key] == 'object') {
                options[key] = {
                    ...parent[key],
                    ...child[key]
                }
            } else {
                // 按照子节点的合并
                options[key] = child[key];
            }
        }
    }
    return options
}